using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace XUCore.WeChat.App
{
    public interface IWeChatMiniProgramDecrypt
    {
        /// <summary>  
        /// 反序列化包含OpenId和SessionKey的Json数据包
        /// </summary>
        /// <param name="loginInfo">Json数据包</param>
        /// <returns>包含OpenId和SessionKey的类</returns>
        Task<WeChatOpenIdAndSessionKey> DecodeOpenIdAndSessionKey(WeChatLoginInfo loginInfo);

        /// <summary>  
        /// 根据微信小程序平台提供的签名验证算法验证用户发来的数据是否有效  
        /// </summary>  
        /// <param name="rawData">公开的用户资料</param>  
        /// <param name="signature">公开资料携带的签名信息</param>  
        /// <param name="sessionKey">从服务端获取的SessionKey</param>  
        /// <returns>True：资料有效，False：资料无效</returns>  
        bool VaildateUserInfo(string rawData, string signature, string sessionKey);

        /// <summary>  
        /// 根据微信小程序平台提供的签名验证算法验证用户发来的数据是否有效  
        /// </summary>  
        /// <param name="loginInfo">登陆信息</param>  
        /// <param name="sessionKey">从服务端获取的SessionKey</param>  
        /// <returns>True：资料有效，False：资料无效</returns>  
        bool VaildateUserInfo(WeChatLoginInfo loginInfo, string sessionKey);

        /// <summary>  
        /// 根据微信小程序平台提供的签名验证算法验证用户发来的数据是否有效  
        /// </summary>  
        /// <param name="loginInfo">登陆信息</param>  
        /// <param name="idAndKey">包含OpenId和SessionKey的类</param>  
        /// <returns>True：资料有效，False：资料无效</returns>  
        bool VaildateUserInfo(WeChatLoginInfo loginInfo, WeChatOpenIdAndSessionKey idAndKey);

        /// <summary>  
        /// 根据微信小程序平台提供的解密算法解密数据  
        /// </summary>  
        /// <param name="encryptedData">加密数据</param>  
        /// <param name="iv">初始向量</param>  
        /// <param name="sessionKey">从服务端获取的SessionKey</param>  
        /// <returns></returns>  
        WeChatUserInfo DecryptForInfo(string encryptedData, string iv, string sessionKey);

        /// <summary>
        /// 根据微信小程序平台提供的解密算法解密数据，推荐直接使用此方法，需要传入 loginInfo.rawData, loginInfo.signature 进行信息校验
        /// </summary>
        /// <param name="loginInfo">登陆信息</param>  
        /// <returns>用户信息</returns>  
        Task<WeChatUserInfo> DecryptForInfo(WeChatLoginInfo loginInfo);

        /// <summary>  
        /// 微信小程序解密手机号码 根据微信小程序平台提供的解密算法解密数据，推荐直接使用此方法  
        /// </summary>  
        /// <param name="loginInfo">登陆信息</param>  
        /// <returns>用户信息</returns>  
        Task<WeChatMobileInfo> DecryptForPhone(WeChatLoginInfo loginInfo);

        /// <summary>
        /// 微信小程序解密手机号码 开放数据校验与解密 加密数据解密算法
        /// </summary>
        WeChatMobileInfo DecryptForPhone(string encryptedData, string iv, string sessionKey);
    }
}